<?php

/*
	Question2Answer (c) Gideon Greenspan

	http://www.question2answer.org/

	
	File: qa-include/qa-search-basic.php
	Version: See define()s at top of qa-include/qa-base.php
	Description: Basic module for indexing and searching Q2A posts


	This program is free software; you can redistribute it and/or
	modify it under the terms of the GNU General Public License
	as published by the Free Software Foundation; either version 2
	of the License, or (at your option) any later version.
	
	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	More about this license: http://www.question2answer.org/license.php
*/

if (!defined('QA_VERSION')) { // don't allow this page to be requested directly from browser
    header('Location: ../');
    exit;
}


class qa_search_basic
{

    function index_post($postid, $type, $questionid, $parentid, $title, $content, $format, $text, $tagstring, $categoryid)
    {
        require_once QA_INCLUDE_DIR . 'qa-db-post-create.php';

        //	Get words from each textual element

        $titlewords = array_unique(qa_string_to_words($title));
        $contentcount = array_count_values(qa_string_to_words($text));
        $tagwords = array_unique(qa_string_to_words($tagstring));
        $wholetags = array_unique(qa_tagstring_to_tags($tagstring));

        //	Map all words to their word IDs

        $words = array_unique(array_merge($titlewords, array_keys($contentcount), $tagwords, $wholetags));
        $wordtoid = qa_db_word_mapto_ids_add($words);

        //	Add to title words index

        $titlewordids = qa_array_filter_by_keys($wordtoid, $titlewords);
        qa_db_titlewords_add_post_wordids($postid, $titlewordids);

        //	Add to content words index (including word counts)

        $contentwordidcounts = array();
        foreach ($contentcount as $word => $count)
            if (isset($wordtoid[$word]))
                $contentwordidcounts[$wordtoid[$word]] = $count;

        qa_db_contentwords_add_post_wordidcounts($postid, $type, $questionid, $contentwordidcounts);

        //	Add to tag words index

        $tagwordids = qa_array_filter_by_keys($wordtoid, $tagwords);
        qa_db_tagwords_add_post_wordids($postid, $tagwordids);

        //	Add to whole tags index

        $wholetagids = qa_array_filter_by_keys($wordtoid, $wholetags);
        qa_db_posttags_add_post_wordids($postid, $wholetagids);

        //	Update counts cached in database (will be skipped if qa_suspend_update_counts() was called

        qa_db_word_titlecount_update($titlewordids);
        qa_db_word_contentcount_update(array_keys($contentwordidcounts));
        qa_db_word_tagwordcount_update($tagwordids);
        qa_db_word_tagcount_update($wholetagids);
        qa_db_tagcount_update();
    }


    function unindex_post($postid)
    {
        require_once QA_INCLUDE_DIR . 'qa-db-post-update.php';

        $titlewordids = qa_db_titlewords_get_post_wordids($postid);
        qa_db_titlewords_delete_post($postid);
        qa_db_word_titlecount_update($titlewordids);

        $contentwordids = qa_db_contentwords_get_post_wordids($postid);
        qa_db_contentwords_delete_post($postid);
        qa_db_word_contentcount_update($contentwordids);

        $tagwordids = qa_db_tagwords_get_post_wordids($postid);
        qa_db_tagwords_delete_post($postid);
        qa_db_word_tagwordcount_update($tagwordids);

        $wholetagids = qa_db_posttags_get_post_wordids($postid);
        qa_db_posttags_delete_post($postid);
        qa_db_word_tagcount_update($wholetagids);
    }


    function move_post($postid, $categoryid)
    {
        // for now, the built-in search engine ignores categories
    }


    function index_page($pageid, $request, $title, $content, $format, $text)
    {
        // for now, the built-in search engine ignores custom pages
    }


    function unindex_page($pageid)
    {
        // for now, the built-in search engine ignores custom pages
    }


    function process_search($query, $start, $count, $userid, $absoluteurls, $fullcontent)
    {
        require_once QA_INCLUDE_DIR . 'qa-db-selects.php';
        require_once QA_INCLUDE_DIR . 'qa-util-string.php';

        $words = qa_string_to_words($query);

        $questions = qa_db_select_with_pending(
            qa_db_search_posts_selectspec($userid, $words, $words, $words, $words, trim($query), $start, $fullcontent, $count)
        );

        $results = array();

        foreach ($questions as $question) {
            qa_search_set_max_match($question, $type, $postid); // to link straight to best part

            $results[] = array(
                'question' => $question,
                'match_type' => $type,
                'match_postid' => $postid,
            );
        }

        return $results;
    }

}


/*
	Omit PHP closing tag to help avoid accidental output
*/